﻿using System;
using System.Windows.Forms;
using CloudShot.Core.Interfaces;
using CloudShot.Core.Utils;

namespace DropboxImageStorage
{
  public partial class DropboxStorageSettingsControl : UserControl, ISettingsControl
  {
    private readonly DropboxStorage _storage;
    
    public IImageStorage Storage
    {
      get { return _storage; }
    }

    public Control Control
    {
      get { return this; }
    }

    public IConfigurationSection Configuration { get; set; }

    public DropboxStorageSettingsControl(DropboxStorage storage)
    {
      _storage = storage;
      InitializeComponent();
    }

    public void Loading()
    {
      cboImageFormat.Items.Clear();

      foreach (string extension in _storage.SupportedFormats.GetImageExtensions())
      {
        cboImageFormat.Items.Add(extension);
      }

      var settings = Configuration.GetOrCreateAs<DropboxSettings>();

      cboImageFormat.SelectedItem = settings.CurrentImageFormat.GetImageExtension();

      rdoDefaultLink.Checked = !settings.UseDirectLink && !settings.ShortenUrls;
      rdoDirectLink.Checked = settings.UseDirectLink;
      rdoShortLink.Checked = settings.ShortenUrls;
      
      oAuthControl.SetState(settings.Token != null ? AuthState.Authorized : AuthState.NotAuthorized);
    }

    public void OkClicked()
    {
      var settings = Configuration.GetOrCreateAs<DropboxSettings>();

      settings.CurrentImageFormat = ImageTypeUtils.GetImageType((string)cboImageFormat.SelectedItem);
      settings.UseDirectLink = rdoDirectLink.Checked;
      settings.ShortenUrls = rdoShortLink.Checked;

      Configuration.SaveAs(settings);
    }

    public void CancelClicked()
    {
      //cancel wait to authorization
      if (oAuthControl.AuthState == AuthState.WaitAuthorization)
        Unlink();
    }

    public bool ValidateData()
    {
      if (cboImageFormat.SelectedItem == null)
      {
        //TODO может лучше возвращать список ошибок текстом и показывать MsgBox из SettingsForm, чтобы это для всех плагинов было однообразно?
        MessageBox.Show(LocalResources.DropboxStorageSettingsControl_NotSetImageFormatError, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);

        //TODO не будет работать, т.к. текущий сторадж может быть еще не активен, в случае если текущий сторадж активен - фокус выставляется нормально
        cboImageFormat.Focus();

        return false;
      }

      return true;
    }

    private async void SignIn()
    {
      oAuthControl.SetState(AuthState.WaitAuthorization);

      bool success = await _storage.SignIn();

      oAuthControl.SetState(success ? AuthState.Authorized : AuthState.NotAuthorized);
    }

    private void Unlink()
    {
      _storage.SignOut();
      oAuthControl.SetState(AuthState.NotAuthorized);
    }

    #region Event Handlers

    private void OnSignInClick(object sender, EventArgs e)
    {
      SignIn();
    }

    private void OnUnlinkClick(object sender, EventArgs e)
    {
      Unlink();
    }

    private void OnCancelWaitingClick(object sender, EventArgs e)
    {
      Unlink();
    }

    #endregion
  }
}